[Ruby on Rails] Sidekiq で非同期処理を実装する
Sidekiq とは
Sidekiq とは Rails アプリで非同期処理を行うためのライブラリです。複数のジョブを同時に実行することができ、メモリを節約することができます。
ということで今回は Sidekiq の基本と使いかたをざっくりと学んでいきたいと思います。
Sidekiq を使ってみる
インストール
まず前提条件として Redis が必要なのでインストールしましょう。Redis はジョブの管理に使われています。
brew install redis
インストールは Gemfile に追加して bundle install するだけです!
vim Gemfile # gem 'sidekiq' を追加 bundle install
Worker を実装する
非同期処理を行うクラスは Sidekiq::Worker を include してつくります。あとは perform メソッドの中に非同期で行いたい処理を書くだけです。引数は自由に追加して OK です。
app/workers/hard_worker.rb
class HardWorker include Sidekiq::Worker def perform(name, count) puts 'Doing hard work: name=' + name + ', count=' + count.to_s end end
この Worker は以下のように呼び出します。
HardWorker.perform_async('Classmethod', 1)
起動する
実際に動かしてみましょう。まずは以下のコマンドで Sidekiq のコンソールを起動します。
bundle exec sidekiq
あとは Worker を呼び出してみます。
bundle exec rails c Loading development environment (Rails 3.2.12) irb(main):002:0> HardWorker.perform_async('Classmethod', 1)
Sidekiq コンソールに出力されました!
2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: Booting Sidekiq 2.6.5 with Redis at redis://localhost:6379/0 2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: Running in ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0] 2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: See LICENSE and the LGPL-3.0 for licensing details. 2013-03-07T06:51:41Z 6339 TID-ox29aw7a8 INFO: Starting processing, hit Ctrl-C to stop 2013-03-07T06:51:51Z 6339 TID-ox29m4c7w HardWorker JID-e4089dd40a829ccffeda65cd INFO: start Doing hard work: name=Classmethod, count=1 2013-03-07T06:51:51Z 6339 TID-ox29m4c7w HardWorker JID-e4089dd40a829ccffeda65cd INFO: done: 0.0 sec
時間差で実行
以下のようにスケジュールしたタイミングで Worker を実行させることもできます。
HardWorker.perform_in(3.hours, 'Classmethod', 1)
これは3時間後に実行する設定です。perform_in メソッドで使っていた引数は第二引数以降に設定します。また Sidekiq はスケジュールされたジョブをデフォルトでは 15 秒間隔で確認しにいきます。もっと短い周期で確認したい場合は以下ように書きます。
Sidekiq.configure_server do |config| config.poll_interval = 5 end
また、スケジュールしたジョブをすべてクリアしたい場合は以下のように書きます。
Sidekiq::ScheduledSet.new.clear
ブラウザから監視する
Sidekiq のジョブをブラウザから監視するツールを使ってみましょう。まずは Gemfile を編集し、以下を追加します。
Gemfile
gem 'slim' gem 'sinatra', '>= 1.3.0', :require => nil
次にブラウザから監視できるよう routes.rb を編集します。
require 'sidekiq/web' mount Sidekiq::Web => '/sidekiq'
以上で完了です!アプリを起動させてブラウザからアクセスしてみましょう。
bundle exec rails s
まとめ
Sidekiq を使った非同期処理の実装方法を紹介しました。難しいところは特にないので、導入しやすいとおもいます。動作もサクサクで良い感じですね。
ということで、時間のかかる処理は Sidekiq におまかせしましょう!